<?php
require_once(dirname(__FILE__) . '/../szpe_start.php'); //Подключаем главный конфигурационный файл
require_once('./system/config.php'); //Подключаем главный конфигурационный файл
Pressure::setStart(); // Начинаем сбор данных о нагрузке страницы

// Временно удаляем все куки с поддоменов
/*foreach ($_COOKIE as $name => $value) {
	setcookie($name, null, null, '/');
	if (!is_array($value)) setcookie($name, $value, time() + 7 * 24 * 3600, '/', DOMAIN);
}*/

$getStrPos = strpos($_SERVER['REQUEST_URI'], '?');
$strUrl = substr($_SERVER['REQUEST_URI'], 0, $getStrPos ? $getStrPos : strlen($_SERVER['REQUEST_URI']));
$arrRequest = explode('/', substr($strUrl, strlen(W_ABSPATH))); // Преобразовываем URL к массиву

User_Session::registerReferer(); // Сохраняем поисковые запросы если есть

for ($i = 0; $i <= 5; $i++) {
	if (!isset($arrRequest[$i])) $arrRequest[$i] = ''; // Для упрощения обработки контроллером	
}
if ($arrRequest[0] == 'hms') User_Session::moveTo(W_HOTEL_ADMIN_FULLPATH . str_replace('//', '/', join('/', array_slice($arrRequest, 1))));

$subDomain = 'www';
if (isset($_SERVER['HTTP_HOST'])) {
	$subDomain = substr($_SERVER['HTTP_HOST'], 0, strpos($_SERVER['HTTP_HOST'], '.'));
	if ($subDomain == 'extranet') $arrRequest = array_merge(array('hms'), $arrRequest);
	elseif ($subDomain == 'm') $arrRequest = array_merge(array('mobile'), $arrRequest);
	elseif ($subDomain == 'api') $arrRequest = array_merge(array('api'), $arrRequest);
}

if (!defined('MAIL_CLASS_DEFINED')) { // Проверка на сервере ли мы
	if (isset($_SERVER['HTTP_HOST'])) {		
		if (!($subDomain == 'www' || $subDomain == 'extranet' || $subDomain == 'm' || $subDomain == 'api')  && ($arrRequest[0] != 'ajax' || $arrRequest[1] != 'hotel' || $arrRequest[2] != 'check_available')) {
			if (substr(DOMAIN, 0, strpos(DOMAIN, '.')) != $subDomain) User_Session::moveTo(W_FULLPATH . substr($_SERVER['REQUEST_URI'], 1));	
		}
	}
}
if ($arrRequest[0] == 'hms') {
	if (in_array($arrRequest[1], array('ajax', 'auth', 'cms'))) $arrRequest = array_slice($arrRequest, 1);
}

if ($arrRequest[0] == 'mobile') {
	if (in_array($arrRequest[1], array('ajax', 'auth'))) $arrRequest = array_slice($arrRequest, 1);
	$version = 'mobile';
}
// Определение контроллера для обработки запроса
switch ($arrRequest[0]) {
	
	case '': case 'index.html': // Главная страница
		$controller = new Controller_Index($arrRequest); 
		break;
	case 'auth': // Страницы, связанные с аутентификацией
		$controller = new Controller_Auth($arrRequest);
		break;
	case 'profile': // Страницы, связанные с профайлом пользователя
		$controller = new Controller_Profile($arrRequest);
		break;
	case 'orders': // Страницы, связанные с заказами по перевозке грузов
		$controller = new Controller_Order($arrRequest);
		break;
	case 'pressure': // Страницы, связанные с Нагрузкой на сайте
		$controller = new Controller_Pressure($arrRequest);
		break;
	case 'parse': // Страницы, связанные с парсингом данных
		$controller = new Controller_Parse($arrRequest);
		break;	
	case 'drivers': // Страницы для диспетчера, связанные с водителями
		$controller = new Controller_Driver($arrRequest); 
		break;
	case 'directions': // Страницы набора "Наши направления"
		$controller = new Controller_Direction($arrRequest);
		break;
	case 'routes': // Страницы маршрутов
		$controller = new Controller_Direction($arrRequest);
		break;
	// Наборы страниц, каждый из которых отвечает за конкретный федеральный округ 
	case 'tsfo': case 'yufo': case 'szfo': case 'dfo': case 'sfo': case 'ufo': case 'pfo': case 'skfo': case 'traffic':
		$controller = new Controller_Direction($arrRequest);
		break;
	// Наборы старых страниц, каждый из которых отвечала за конкретный федеральный округ(проиндексированные, но удалённые)
	case 'tsentralnyiy_federalnyiy_okrug': case 'yujnyiy_federalnyiy_okrug': case 'severo_zapadnyiy_federalnyiy_okrug': case 'dalnevostochnyiy_federalnyiy_okrug': case 'sibirskiy_federalnyiy_okrug': case 'uralskiy_federalnyiy_okrug': case 'privoljskiy_federalnyiy_okrug': case 'severo_kavkazskiy_federalnyiy_okrug':
		$controller = new Controller_Direction($arrRequest);
		break;
	case 'test': // Страницы связанные с тестированием
		$controller = new Controller_Test($arrRequest);
		break;
	case 'cms':	// Обработка страниц админки
    switch ($arrRequest[1]) {
	  	case '':case 'articles': // Админка - обработка действий, связанных со статьями
		    $controller = new Controller_Admin_Article($arrRequest);
		    break;
	  	case 'cities': // Админка - обработка действий, связанных с городами
		    $controller = new Controller_Admin_City($arrRequest);
		    break;
	  	case 'notifications': // Админка - обработка действий, связанных с оповещениями
		    $controller = new Controller_Admin_Notification($arrRequest);
		    break;
	  	case 'finist': // Админка - обработка действий, связанных с таблицей finist
		    $controller = new Controller_Admin_Finist($arrRequest);
		    break;
	    case 'routes': // Админка - обработка действий, связанных с маршрутами
	    	$controller = new Controller_Admin_Routes($arrRequest);
	    	break;
	  	case 'eng': // Админка - обработка действий, связанных с таблицей finist
		    $controller = new Controller_Admin_Eng($arrRequest);
		    break;
		  default:
		    $controller = new Controller_Admin($arrRequest);
		}
		break;
	case 'ajax': // обработка AJAX - запросов
	  switch ($arrRequest[1]) {
	  	case 'common': // AJAX - обработка общих действий
		    $controller = new Controller_Ajax_Common($arrRequest);
		    break;
		case 'driver':
			$controller = new Controller_Ajax_Driver($arrRequest);
		    break;
		case 'order':
		    $controller = new Controller_Ajax_Order($arrRequest);
		    break;
		case 'city':
			$controller = new Controller_Ajax_City($arrRequest);
		    break;
		case 'user':
		    $controller = new Controller_Ajax_User($arrRequest);
		    break;
	  	case 'autosuggest': // AJAX - обработка автоподстановки
		    $controller = new Controller_Ajax_Autosuggest($arrRequest);
		    break;	
	    case 'notify': 
	    	$controller = new Controller_Ajax_Notify($arrRequest);
	    	break;
		  default:
		    $controller = new Controller_Ajax($arrRequest);
		}
		break;
	case 'php_test':
		if (!$arrRequest[1]) $arrRequest[1] = 'all.php';
		include_once(CLASSES . 'Test/' . $arrRequest[1]);
		$duration = Pressure::calculateCurrentDuration();
    Pressure::saveDuration($_SERVER['REQUEST_URI'], $duration);
    exit();
	  break;
	  
	default:
	  $controller = new Controller_Default($arrRequest); // Контроллер по умолчанию
	  break;
}
$controller->version = empty($version) ? 'main' : $version;

if ($controller->error) $controller->showError(); // Проверка не возникли ли ошибки при создании объекта
else {
	//$controller->action();
	//if ($controller->error) $controller->showError(); // Вывод страницы ошибки при её наличии
	
	try {
		$controller->action();
	}
	catch (Exception $e) {
		$errors = array(404, 403, 503);
		if (in_array($e->getCode(), $errors)) {
			$controller->setError($e->getCode());
			$controller->showError();
		}
	}
}

$duration = Pressure::calculateCurrentDuration();
Pressure::saveDuration($_SERVER['REQUEST_URI'], $duration);
?>